<?php
/**
 * 微信支付操作
 * @author zlj <389843954@qq.com>
 */
namespace app\common\model;
use app\common\model\User;
Vendor('WxPayApi.WxPay#JsApiPay');
Vendor('WxPayApi.WxPay#NativePay');
class Wepay
{
    /**
     * 下订单
     * @param  [string] $tradedes [商品描述]
     * @param  [string] $amoney   [金额  单位:分]
     * @return [type]           [description]
     */
    public function aOrder($tradedes,$amoney){

        //①、获取用户openid
        $tools = new \JsApiPay();
        //②、统一下单 
        $input = new \WxPayUnifiedOrder();
        $configModel = new \WxPayConfig();
        $payApi = new \WxPayApi();
        
        $openId = $tools->GetOpenid();

        //支付成功回调地址
        $notify_url = config("WECHAT_NOTIFY_URL");

        //商品或支付单简要描述
        $input->SetBody($tradedes);

        //设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号 
        // $payOrderTrade = $configModel::MCHID.date("YmdHis").rand(1,9999);
        $payOrderTrade = time().rand(1,9999);
        $input->SetOut_trade_no($payOrderTrade);
        //设置订单总金额，只能为整数，详见支付金额 （单位为:分）
        $input->SetTotal_fee($amoney);
        //设置订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010
        $input->SetTime_start(date("YmdHis"));
        //设置订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为2009122709101
        $input->SetTime_expire(date("YmdHis", time() + 600));
        
        //设置接收微信支付异步通知回调地址
        $input->SetNotify_url($notify_url);
        //设置取值如下：JSAPI，NATIVE，APP
        $input->SetTrade_type("JSAPI");
        //设置trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid
        $input->SetOpenid($openId);
        //生成订单
        $order = $payApi->unifiedOrder($input);


        $jsApiParameters = $tools->GetJsApiParameters($order);
        //获取共享收货地址js函数参数
        $editAddress = $tools->GetEditAddressParameters();
        
        $data = [
            'jsApiParameters'=>$jsApiParameters,
            'editAddress'=>$editAddress,
            'order'=>[
                'oid'=>$payOrderTrade,
                'openid'=>$openId
            ]
        ];
        return $data;
    }

	/**
     * 查询订单
     * @param [bool]   $type   true:商户订单号    false:微信订单号
     * @param [string] $transaction_id [订单号]
     * 支付成功:
	 * [appid] => 
	 * [attach] => array()
	 * [bank_type] => CFT
	 * [cash_fee] => 1
	 * [fee_type] => CNY
	 * [is_subscribe] => Y
	 * [mch_id] => 
	 * [nonce_str] => hg59eCefQXkj3xOJ
	 * [openid] => 
	 * [out_trade_no] => 20161014165856
	 * [result_code] => SUCCESS
	 * [return_code] => SUCCESS
	 * [return_msg] => OK
	 * [sign] => D6D22CDD1BE4DC104175A8A554799E07
	 * [time_end] => 20161014165909
	 * [total_fee] => 1
	 * [trade_state] => SUCCESS
	 * [trade_type] => NATIVE
	 * [transaction_id] => 4007842001201610146667059469
	 * 支付未完成:
	 * [appid] => 
     * [mch_id] => 
     * [nonce_str] => 2GYdWvd9hcyGAbtk
     * [out_trade_no] => 20161014175546
     * [result_code] => SUCCESS
     * [return_code] => SUCCESS
     * [return_msg] => OK
     * [sign] => C0DF4F604E36761D59A147A30EA0E312
     * [trade_state] => NOTPAY
     * [trade_state_desc] => 订单未支付
     */
    public function Queryorder($orderId,$type=true){
        $input = new \WxPayOrderQuery();
        $WxPayApi = new \WxPayApi();

        if($type){
        	//商户订单号
			$input->SetOut_trade_no($orderId);
        }else{
        	//微信订单号
       		$input->SetTransaction_id($orderId);
        }

        $result = $WxPayApi->orderQuery($input);

        return $result;
    }

    /**
     * 申请退款
     * @param  [string] $orderId    [type:true 微信订单号   false:商户订单号 ]
     * @param  [type] $type       
     * @param  [type] $total_fee  [订单总金额 只能为整数 (分)]
     * @param  [type] $refund_fee [退款总金额]
     * @return [type]             [成功时返回，其他抛异常]
     */
    public function reFunds($orderId,$type,$total_fee,$refund_fee){
        $input = new \WxPayRefund();

        if($type){
            //微信订单号
            $input->SetTransaction_id($transaction_id); //微信订单号
        }else{
            //商户订单号
            $input->SetOut_trade_no($out_trade_no);
        }

        $input->SetTotal_fee($total_fee); 
        $input->SetRefund_fee($refund_fee); 
        $input->SetOut_refund_no($configModel->MCHID.date("YmdHis")); //商户系统内部的退款单号
        $input->SetOp_user_id($configModel->MCHID); //作员帐号, 默认为商户号
        $res = $payApi->refund($input); //申请退款

        if($res['return_code']=='SUCCESS'){
            $data = array(
                'code'=>true,
                'msg'=>'成功'
            );
        }else{
            $data = array(
                'code'=>false,
                'msg'=>$res['return_msg']
            );
        }

        return $data;
    }
}